/**
 * 常用工具类
 */
class Utils {
  /**
   * 深拷贝
   * @param value
   * @returns
   */
  public cloneDeep<T>(value: T): T {
    if (!value) {
      return value;
    }
    /**
     * 数组
     */
    if (Array.isArray(value)) {
      return value.map((item) => this.cloneDeep(item)) as unknown as T;
    }
    /**
     * 日期
     */
    if (value instanceof Date) {
      return new Date(value) as unknown as T;
    }
    /**
     * 普通对象
     */
    if (typeof value === 'object') {
      return Object.fromEntries(
        Object.entries(value).map(([k, v]: [string, any]) => {
          return [k, this.cloneDeep(v)];
        }),
      ) as unknown as T;
    }
    /**
     * 基本类型
     */
    return value;
  }

  /**
   * 封装本地存储
   * @param key
   * @param value
   */
  public setLocalStorage<T>(key: string, value: T): void {
    window.localStorage.setItem(key, JSON.stringify(value));
  }

  /**
   * 获取本地存储
   * @param key
   */
  public getLocalStorage<T>(key: string): T | null {
    let data = window.localStorage.getItem(key);
    if (!data || data === 'null') {
      return null;
    }
    try {
      let obj: T = JSON.parse(data);
      return obj;
    } catch (error) {
      return null;
    }
  }

  /**
   * 判断是不是JSON字符串
   * @param text
   * @returns
   */
  public isValidJSON(text: string): boolean {
    try {
      JSON.parse(text);
      return true;
    } catch (error) {
      return false;
    }
  }

  /**
   * 去空格
   * @param str
   * @returns
   */
  public trimString(str: string): string {
    return str.replace(/(^\s*)|(\s*$)/g, '');
  }
}

/**
 * 导出工具类，并实例化类
 */
export default new Utils();
